package cn.tedu.service;

import cn.tedu.dao.GoodsMapper;
import cn.tedu.entity.Goods;
import cn.tedu.service.port.GoodsService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service("goodsService")
public class GoodsServiceImpl implements GoodsService {

    @Resource
    private GoodsMapper goodsMapper;

    private Integer countPerPage = COUNT_PER_PAGE;

    /**
     * 根据商品分类获取商品列表
     * @param categoryId   分类id
     * @param orderBy       排序
     * @param offset        偏移量，即跳过前面的多少条数据，如果从头开始获取则设置为0
     * @param count         获取数据的数量
     * @return              商品分类列表
     */
    public List<Goods> getGoodsListByCategoryId(Integer categoryId, String orderBy, Integer offset, Integer count) {
        return goodsMapper.getGoodsListByCategoryId(categoryId, orderBy, offset, count);
    }

    /**
     * 根据商品分类获取商品列表(重载方法)
     * @param categoryId   分类id
     * @param offset        偏移量，即跳过前面的多少条数据，如果从头开始获取则设置为0
     * @param count         获取数据的数量
     * @return              商品分类列表
     */
    public List<Goods> getGoodsListByCategoryId(Integer categoryId, Integer offset, Integer count) {
        return getGoodsListByCategoryId(
                categoryId,
                ORDER_BY_DEFAULT,
                offset,
                count);
    }

    /**
     * 设置每页显示的商品数量
     * @param countPerPage 每页显示的商品数量
     */
    public void setCountPerPage(int countPerPage) {
        if (COUNT_PER_PAGE >= 5 && COUNT_PER_PAGE <=30){
            this.countPerPage = countPerPage;
        }
    }

    /**
     * 获取每页显示的商品数量
     * @return 每页显示的商品数量
     */
    public Integer getCountPerPage() {
        return this.countPerPage;
    }

    /**
     * 根据商品分类获取商品列表
     *
     * @param categoryId    商品分类的ID
     * @param orderBy       排序方式，值为SQL代码
     * @param page          获取第几页的数据
     * @return              商品列表，如果没有匹配的数据，则返回长度为0的List集合
     */
    public List<Goods> getGoodsListByCategoryId(
            Integer categoryId,
            String orderBy,
            Integer page) {
        Integer offset = (page-1) * getCountPerPage();
        Integer conut = getCountPerPage();
        return getGoodsListByCategoryId(
                categoryId, orderBy, offset, conut);
    }

    /**
     * 根据商品分类获取商品列表
     * @param categoryId    商品分类的ID
     * @param page          获取第几页的数据
     * @return              商品列表，如果没有匹配的数据，则返回长度为0的List集合
     */
    public List<Goods> getGoodsListByCategoryId(
            Integer categoryId, Integer page){

        return getGoodsListByCategoryId(
                categoryId, ORDER_BY_DEFAULT, page);
    }

    /**
     * 根据商品分类获取商品列表，只显示第1页的数据
     * @param categoryId    商品分类的ID
     * @param orderBy       排序方式，值为SQL代码
     * @return              商品列表，如果没有匹配的数据，则返回长度为0的List集合
     */
    public List<Goods> getGoodsListByCategoryId(
            Integer categoryId, String orderBy){

        return getGoodsListByCategoryId(categoryId, orderBy, 1);
    }

    /**
     * 根据商品分类获取商品列表，按照默认的排序方式（根据优先级）进行排序，只显示第1页的数据
     * @param categoryId    商品分类的ID
     * @return              商品列表，如果没有匹配的数据，则返回长度为0的List集合
     */
    public List<Goods> getGoodsListByCategoryId(
            Integer categoryId){
        return getGoodsListByCategoryId(categoryId, ORDER_BY_DEFAULT, 1);
    }

    /**
     * 获取某分类的商品的总数量
     * @param categoryId    分类的id
     * @return              商品的数量
     */
    public Integer getGoodsCountByCategoryId(Integer categoryId){
        return goodsMapper.getGoodsCountByCategoryId(categoryId);
    }

    /**
     * 根据商品id获取商品信息
     * @param id    商品id
     * @return      返回商品信息
     */
    public Goods getGoodsById(Integer id){
        return goodsMapper.getGoodsById(id);
    }

    /**
     * 根据item_type获取商品列表
     * @param itemType  商品item_type
     * @return          返回商品列表
     */
    public List<Goods> getGoodsListByItemType(String itemType){
        return goodsMapper.getGoodsListByItemType(itemType);
    }

}
